#!/usr/bin/python3
# -*- encoding:utf-8 -*-
# author: king
# create date time: 2024/4/15 下午9:20

"""
命令模式（Command Pattern）是一种行为型设计模式，它将请求封装成一个对象，从而允许您根据不同的请求参数化客户端，并将请求与其接收者解耦。

命令模式中的关键角色
Command（命令）：声明了执行操作的接口。通常包含一个 execute 方法，用于执行具体的操作。
ConcreteCommand（具体命令）：实现了 Command 接口，具体定义了执行操作的逻辑。
Receiver（接收者）：执行命令所定义的操作。具体实现了执行操作的细节。
Invoker（调用者）：负责调用命令对象并触发执行操作的请求。
Client（客户端）：创建具体命令对象并配置命令对象的接收者。

命令模式的优点
解耦调用者和接收者：调用者不直接调用接收者的方法，而是通过命令对象间接调用，从而解耦了两者之间的关系。
可扩展性：可以轻松添加新的命令和接收者，而无需修改现有的代码。
支持撤销操作：由于命令对象封装了操作的执行，可以实现撤销和重做操作。

命令模式在需要将请求封装为对象，并对请求进行参数化、队列化、记录日志等情况下非常有用。它提供了一种灵活的方式来组织和管理复杂的操作流程，并使代码更具可扩展性和可维护性。
"""

import os
import sys
from abc import ABC, abstractmethod
from loguru import logger


class Command(ABC):
    @abstractmethod
    def execute(self):
        pass


class LightOnCommand(Command):
    def __init__(self, light):
        self.light = light

    def execute(self):
        self.light.turn_on()


class LightOffCommand(Command):
    def __init__(self, light):
        self.light = light

    def execute(self):
        self.light.turn_off()


class Light:
    def turn_on(self):
        logger.info("Light is on")

    def turn_off(self):
        logger.info("Light is off")


class RemoteControl:
    def __init__(self):
        self.commands = {}

    def set_command(self, slot, command):
        self.commands[slot] = command

    def press_button(self, slot):
        if slot in self.commands:
            self.commands[slot].execute()


def main():
    """程序入口"""
    light = Light()
    light_on_command = LightOnCommand(light)
    light_off_command = LightOffCommand(light)
    remote_control = RemoteControl()
    remote_control.set_command(1, light_on_command)
    remote_control.set_command(2, light_off_command)

    remote_control.press_button(1)
    remote_control.press_button(2)


if __name__ == "__main__":
    main()
